package org.ssssssss.magicapi.mqtt;

import net.dreamlu.iot.mqtt.codec.ByteBufferUtil;
import net.dreamlu.iot.mqtt.core.server.MqttServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.ssssssss.magicapi.core.service.MagicAPIService;

import java.io.IOException;

public class MqttServerStarter {
	
	private static MagicAPIService service;
	
	public static void setService(MagicAPIService service) {
		MqttServerStarter.service = service;
	}
	public static MagicAPIService getService() {
		return service;
	}
	
	private static final Logger logger = LoggerFactory.getLogger(MqttServerStarter.class);
	private static MqttServer mqttServer;
	public static void start(int port) throws IOException {
		
		if(service!=null) {
			System.out.println("OK");
		}
		else {
			System.out.println("@Autowired MagicAPIService ERR");
		}
		
		logger.info("启动MQTT broker");
		// 注意：为了能接受更多链接（降低内存），请添加 jvm 参数 -Xss129k
		mqttServer = MqttServer.create()
			// 服务端 ip 默认为空，0.0.0.0，建议不要设置
			.ip("0.0.0.0")
			// 默认：1883
			.port(port)
			// mqtt 用户名密码
//			.usernamePassword("mica", "mica")
			// 默认为： 8192（mqtt 默认最大消息大小），为了降低内存可以减小小此参数，如果消息过大 t-io 会尝试解析多次（建议根据实际业务情况而定）
			.readBufferSize(8192)
//			最大包体长度
//			.maxBytesInMessage(1024 * 100)
//			mqtt 3.1 协议会校验 clientId 长度。
//			.maxClientIdLength(64)
//			.messageListener((context, clientId, message) -> {
//				logger.info("clientId:{} message:{} payload:{}", clientId, message, ByteBufferUtil.toString(message.getPayload()));
//			})
			// 客户端连接状态监听
			.connectStatusListener(new MqttConnectStatusListener())
			// 自定义消息拦截器
			.addInterceptor(new MqttMessageInterceptor())
			// 开启 http
			.httpEnable(true)
			// http basic 认证，自定义认证，实现 HttpFilter， 注册到 MqttHttpRoutes 即可
			.httpBasicAuth("mica", "mica")
			// 开启 websocket
			.websocketEnable(true)
			// 开始 stat 监控
			.statEnable()
			// 开启 debug 信息日志
			.debug()
			.start();
	}
	
	public static void stop() {
		mqttServer.stop();
	}
}
